﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Transactions;

using SMA.GENTEv1.Dados;
using SMA.GENTEv1.Exceptions;

namespace SMA.GENTEv1
{
    public class BeneficioOrganizacaoDocto
    {
        #region Variaveis Membro
        private int _idOrganizacaoBeneficio;
        private Organizacao _organizacao;
        private TipoBeneficio _tipoBeneficio;
        private Cidade _localidade;
        private DateTime _dtValidade;
        private string _path;
        private TipoPeriodicidade _tipoPeriodicidade;
        private TipoPagamento _tipoPagamento;
        private OrganizacaoPrestadorServicoProduto _servicoPrestador;
        private DataTable _comboAno;
        private DataTable _gradeProtocolo;
        private GENTEEntities _context;
        #endregion
        
        #region Parametros
        public int IdOrganizacaoBeneficio
        {
            get { return _idOrganizacaoBeneficio; }
            set { _idOrganizacaoBeneficio = value; }
        }

        public Organizacao Organizacao
        {
            get { return _organizacao; }
            set { _organizacao = value; }
        }

        public TipoBeneficio TipoBeneficio
        {
            get { return _tipoBeneficio; }
            set { _tipoBeneficio = value; }
        }

        public Cidade Localidade
        {
            get { return _localidade; }
            set { _localidade = value; }
        }

        public DateTime DtValidade
        {
            get { return _dtValidade; }
            set { _dtValidade = value; }
        }

        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }

        public TipoPeriodicidade TipoPeriodicidade
        {
            get { return _tipoPeriodicidade; }
            set { _tipoPeriodicidade = value; }
        }

        public TipoPagamento TipoPagamento
        {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public OrganizacaoPrestadorServicoProduto ServicoPrestador
        {
            get { return _servicoPrestador; }
            set { _servicoPrestador = value; }
        }
        #endregion

        #region Construtores
        public BeneficioOrganizacaoDocto()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public BeneficioOrganizacaoDocto(int idOrganizacaoBeneficio, bool carregaDados)
        {
            try
            {
                _context = new GENTEEntities();
                if (!carregaDados)
                    this._idOrganizacaoBeneficio = idOrganizacaoBeneficio;
                else
                    Carregar(idOrganizacaoBeneficio, true, true, true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Privados

        #region Métodos Gerais
        private void EstruturaComboAno()
        {
            try
            {
                DataColumn ano = new DataColumn();
                ano.ColumnName = "Ano";
                ano.DataType = Type.GetType("System.Int32");

                _comboAno.Columns.Add(ano);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void EstruturaGradeProtocolo()
        {
            try
            {
                DataColumn idbeneficio = new DataColumn();
                idbeneficio.ColumnName = "IdOrganizacaoBeneficio";
                idbeneficio.DataType = Type.GetType("System.Int32");
                _gradeProtocolo.Columns.Add(idbeneficio);

                DataColumn ano = new DataColumn();
                ano.ColumnName = "Ano";
                ano.DataType = Type.GetType("System.Int32");
                _gradeProtocolo.Columns.Add(ano);

                DataColumn localidade = new DataColumn();
                localidade.ColumnName = "Localidade";
                localidade.DataType = Type.GetType("System.String");
                _gradeProtocolo.Columns.Add(localidade);

                DataColumn mesparcela = new DataColumn();
                mesparcela.ColumnName = "MesParcela";
                mesparcela.DataType = Type.GetType("System.String");
                _gradeProtocolo.Columns.Add(mesparcela);

                DataColumn semana = new DataColumn();
                semana.ColumnName = "Semana";
                semana.DataType = Type.GetType("System.String");
                _gradeProtocolo.Columns.Add(semana);

                DataColumn path = new DataColumn();
                path.ColumnName = "Path";
                path.DataType = Type.GetType("System.String");
                _gradeProtocolo.Columns.Add(path);

                DataColumn dataEntrega = new DataColumn();
                dataEntrega.ColumnName = "DtEntrega";
                dataEntrega.DataType = Type.GetType("System.DateTime");
                _gradeProtocolo.Columns.Add(dataEntrega);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private string ObterNomeImagem(int idOrganizacao, int docto, int idOrganizacaoBeneficio)
        {
            try
            {
                string resultado = "";

                TipoDocumento tipodocto = new TipoDocumento();
                resultado = tipodocto.ObterNomeDocumento(idOrganizacao, docto, idOrganizacaoBeneficio.ToString());

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int ObterCodigoDocumento(int idTipoBeneficio)
        {
            try
            {
                int resultado = 0;

                TipoBeneficio tipoBeneficio = new TipoBeneficio();
                resultado = tipoBeneficio.RetornaTipoDocumento(idTipoBeneficio);

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void VerificaCadastro()
        {
            try
            {
                if (this._organizacao == null)
                    throw new Exception("É necessário informar a empresa prestadora de serviço!");

                if (this._organizacao.IdOrganizacao == 0)
                    throw new Exception("É necessário informar a empresa prestadora de serviço!");

                if (this._tipoBeneficio == null)
                    throw new Exception("É necessário informar o tipo de benefício!");

                if (this._tipoBeneficio.IdTipoBeneficio == 0)
                    throw new Exception("É necessário informar o tipo de benefício!");

                if (this._path == string.Empty)
                    throw new Exception("É necessário informar a imagem!");

                if (this._idOrganizacaoBeneficio == 0)
                {
                    int qtdeRegistro = RetornaQtdeRegistroExistente();
                    if (qtdeRegistro > 0)
                        throw new Exception("Foi encontrado um protocolo deste benefício com as informações inseridas na página. Por favor, faça uma pesquisa para encontrar este protocolo e visualizar seus dados. Esta operação foi cancelada!");
                }
            }
            catch (GenteBaseException ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Seleção
        private void Carregar(int idOrganizacaoBeneficio, bool carregaLocalidade, bool carregaPeriodicidade, bool carregaTipoPagamento)
        {
            try
            {
                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                where beneficio.id_organizacao_beneficio == idOrganizacaoBeneficio
                                select new
                                {
                                    beneficio.id_organizacao_beneficio,
                                    beneficio.tab_cidade.id_cidade,
                                    beneficio.tab_tipo_periodicidade.id_tipo_periodicidade,
                                    beneficio.tab_tipo_pagamento.id_tipo_pagamento,
                                    beneficio.dt_validade,
                                    beneficio.path
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idOrganizacaoBeneficio = list.id_organizacao_beneficio;
                    this._localidade = new Cidade(list.id_cidade);
                    this._tipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);
                    this._tipoPagamento = (carregaTipoPagamento == true) ? new TipoPagamento(list.id_tipo_pagamento) : new TipoPagamento { IdTipoPagamento = list.id_tipo_pagamento };
                    this._dtValidade = list.dt_validade;
                    this._path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int RetornaUltIdOrganizacaoBeneficio()
        {
            try
            {
                int resultado = 0;

                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                orderby beneficio.id_organizacao_beneficio descending
                                select new
                                {
                                    beneficio.id_organizacao_beneficio
                                }).Take(1);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    resultado = list.id_organizacao_beneficio;
                }

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int RetornaQtdeRegistroExistente()
        {
            try
            {
                int resultado = 0;
                int idLocalidade = (this._localidade == null) ? 0 : this._localidade.IdCidade;
                int idTipoPeriodicidade = (this._tipoPeriodicidade == null) ? 0 : this._tipoPeriodicidade.IdTipoPeriodicidade;

                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                where (beneficio.tab_organizacao.Id_organizacao == this._organizacao.IdOrganizacao)
                                && (beneficio.tab_tipo_beneficio.id_tipo_beneficio == this._tipoBeneficio.IdTipoBeneficio)
                                && ((idLocalidade != 0) ? (beneficio.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((idTipoPeriodicidade != 0) ? (beneficio.tab_tipo_periodicidade.id_tipo_periodicidade == idTipoPeriodicidade) : (2 == 2))
                                && (beneficio.tab_tipo_pagamento.id_tipo_pagamento == this._tipoPagamento.IdTipoPagamento)
                                && (beneficio.dt_validade == this._dtValidade)
                                select new
                                {
                                    beneficio.id_organizacao_beneficio
                                });

                return resultado = consulta.ToList().Count;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Persistência
        private void AtualizarPath(string path)
        {
            try
            {
                tab_organizacao_beneficio_documento tabBeneficio = (from beneficio in _context.tab_organizacao_beneficio_documento
                                                                    where beneficio.id_organizacao_beneficio == this._idOrganizacaoBeneficio
                                                                    select beneficio).First();

                tabBeneficio.path = path;
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Métodos Públicos

        #region Métodos Gerais
        public DataTable CarregarComboAno()
        {
            try
            {
                _comboAno = new DataTable();

                EstruturaComboAno();

                int anoAtual = DateTime.Now.Year;
                DataRow registro;
                for (int i = 10; i >= 1; i--)
                {
                    registro = _comboAno.NewRow();
                    registro["Ano"] = anoAtual - (10 - i);

                    _comboAno.Rows.Add(registro);
                }

                return _comboAno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Seleção
        public DataTable CarregarComboAno(int idOrganizacao, int idTipoBeneficio)
        {
            try
            {
                _comboAno = new DataTable();

                EstruturaComboAno();

                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                where beneficio.tab_organizacao.Id_organizacao == idOrganizacao
                                && beneficio.tab_tipo_beneficio.id_tipo_beneficio == idTipoBeneficio
                                select new
                                {
                                    ano_beneficio = beneficio.dt_validade.Year
                                }).Distinct();

                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    registro = _comboAno.NewRow();
                    registro["Ano"] = list.ano_beneficio;

                    _comboAno.Rows.Add(registro);
                }

                return _comboAno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Cidade> CarregarComboCidade(int idOrganizacao, int idTipoBeneficio)
        {
            try
            {
                List<Cidade> listCidade = new List<Cidade>();

                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                where beneficio.tab_organizacao.Id_organizacao == idOrganizacao
                                && beneficio.tab_tipo_beneficio.id_tipo_beneficio == idTipoBeneficio
                                select new
                                {
                                    beneficio.tab_cidade.id_cidade
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Cidade cidade = new Cidade(list.id_cidade);

                    listCidade.Add(cidade);
                }

                return listCidade;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Cidade> CarregarLocalidadesBeneficioColetivo(int idTipoBeneficio, int idOrganizacao, int idContrato)
        {
            try
            {
                List<Cidade> listCidade = new List<Cidade>();

                FrotaRegraContrato regraContrato = new FrotaRegraContrato();
                listCidade = regraContrato.CarregarLocalidadesOrganizacao(idOrganizacao);

                ProcessoContrato processoContrato = new ProcessoContrato();
                List<ProcessoContrato> listProcessoContrato = processoContrato.BuscarProcessoBeneficio(idTipoBeneficio, idContrato, 0, true);

                foreach (ProcessoContrato proc in listProcessoContrato)
                {
                    var consulta = (from cidade in listCidade
                                    where cidade.IdCidade == proc.IdLocalidade
                                    select cidade);

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        listCidade.Remove(list);
                    }
                }

                return listCidade;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable SelectPor(int idOrganizacao, int idTipoBeneficio, int ano, int idLocalidade)
        {
            try
            {
                _gradeProtocolo = new DataTable();

                EstruturaGradeProtocolo();

                var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                where (beneficio.tab_organizacao.Id_organizacao == idOrganizacao)
                                && (beneficio.tab_tipo_beneficio.id_tipo_beneficio == idTipoBeneficio)
                                && ((ano != 0) ? beneficio.dt_validade.Year == ano : (1 == 1))
                                && ((idLocalidade != 0) ? beneficio.tab_cidade.id_cidade == idLocalidade : (2 == 2))
                                select new
                                {
                                    beneficio.id_organizacao_beneficio,
                                    beneficio.tab_organizacao.Id_organizacao,
                                    beneficio.tab_tipo_beneficio.id_tipo_beneficio,
                                    id_cidade = (beneficio.tab_cidade == null) ? 0 : beneficio.tab_cidade.id_cidade,
                                    id_tipo_periodicidade = (beneficio.tab_tipo_periodicidade == null) ? 0 : beneficio.tab_tipo_periodicidade.id_tipo_periodicidade,
                                    id_tipo_pagamento = (beneficio.tab_tipo_pagamento == null) ? 0 : beneficio.tab_tipo_pagamento.id_tipo_pagamento,
                                    beneficio.dt_validade,
                                    beneficio.path
                                });

                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    BeneficioOrganizacaoDocto beneficio = new BeneficioOrganizacaoDocto();

                    beneficio.IdOrganizacaoBeneficio = list.id_organizacao_beneficio;
                    beneficio.Organizacao = new Organizacao(list.Id_organizacao, false, false);
                    beneficio.TipoBeneficio = new TipoBeneficio(list.id_tipo_beneficio, false);
                    beneficio.Localidade = new Cidade(list.id_cidade);
                    beneficio.TipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);
                    beneficio.TipoPagamento = new TipoPagamento(list.id_tipo_pagamento);
                    beneficio.DtValidade = list.dt_validade;
                    beneficio.Path = list.path;

                    registro = _gradeProtocolo.NewRow();
                    registro["IdOrganizacaoBeneficio"] = list.id_organizacao_beneficio;
                    registro["Ano"] = beneficio.DtValidade.Year;
                    registro["Localidade"] = beneficio.Localidade.NomeCidade;

                    switch (beneficio.TipoBeneficio.IdTipoBeneficio)
                    {
                        case (int)TipoBeneficio.TipoBenef.Vale_Transporte:
                            if ((beneficio.TipoPeriodicidade.IdTipoPeriodicidade == 3) || (beneficio.TipoPeriodicidade.IdTipoPeriodicidade == 5))
                            {
                                switch (beneficio.TipoPeriodicidade.IdTipoPeriodicidade)
                                {
                                    case 3:
                                        registro["MesParcela"] = string.Concat(beneficio.DtValidade.Month.ToString("00"), " / ", beneficio.TipoPagamento.Descricao);
                                        break;
                                    case 5:
                                        if (beneficio.DtValidade.Day == 1)
                                            registro["MesParcela"] = string.Concat(beneficio.DtValidade.Month.ToString("00"), " / ", "1ª parcela");
                                        else
                                            registro["MesParcela"] = string.Concat(beneficio.DtValidade.Month.ToString("00"), " / ", "2ª parcela");
                                        break;
                                }
                            }
                            else
                            {
                                registro["MesParcela"] = "";
                            }
                            break;
                        case (int)TipoBeneficio.TipoBenef.Vale_Alimentacao:
                        case (int)TipoBeneficio.TipoBenef.Vale_Refeicao:
                        case (int)TipoBeneficio.TipoBenef.Cesta_Basica:
                        case (int)TipoBeneficio.TipoBenef.Convenio_Medico:
                            string nomeMes = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(beneficio.DtValidade.Month);
                            nomeMes = string.Concat(nomeMes[0].ToString().ToUpper(), nomeMes.Substring(1));
                            registro["MesParcela"] = nomeMes;
                            break;
                        default:
                            registro["MesParcela"] = "";
                            break;
                    }

                    if (beneficio.TipoPeriodicidade.IdTipoPeriodicidade == 4)
                    {
                        Calendario calendario = new Calendario();
                        List<Calendario> listCalendario = calendario.BuscarSemana(beneficio.DtValidade);

                        registro["Semana"] = string.Concat(listCalendario[0].Semana, "ª (", listCalendario[0].DataCompleta.ToString("dd/MM/yyyy"), " a ", listCalendario[listCalendario.Count - 1].DataCompleta.ToString("dd/MM/yyyy"), ")");
                    }
                    else
                    {
                        registro["Semana"] = "";
                    }

                    registro["Path"] = list.path;
                    registro["DtEntrega"] = list.dt_validade;

                    _gradeProtocolo.Rows.Add(registro);
                }

                return _gradeProtocolo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Persistência
        public void Salvar()
        {
            try
            {
                VerificaCadastro();

                if (this._idOrganizacaoBeneficio == 0)
                {
                    tab_organizacao_beneficio_documento tabBeneficio = new tab_organizacao_beneficio_documento();

                    tabBeneficio.tab_organizacaoReference.EntityKey = new EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", this._organizacao.IdOrganizacao);
                    tabBeneficio.tab_tipo_beneficioReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_beneficio", "id_tipo_beneficio", this._tipoBeneficio.IdTipoBeneficio);

                    if (this._localidade == null)
                        tabBeneficio.tab_cidadeReference.EntityKey = null;
                    else
                        tabBeneficio.tab_cidadeReference.EntityKey = new EntityKey("GENTEEntities.tab_cidade", "id_cidade", this._localidade.IdCidade);

                    if (this._tipoPeriodicidade == null)
                        tabBeneficio.tab_tipo_periodicidadeReference.EntityKey = null;
                    else
                        tabBeneficio.tab_tipo_periodicidadeReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_periodicidade", "id_tipo_periodicidade", this._tipoPeriodicidade.IdTipoPeriodicidade);

                    if (this._tipoPagamento == null)
                        tabBeneficio.tab_tipo_pagamentoReference.EntityKey = null;
                    else
                        tabBeneficio.tab_tipo_pagamentoReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", this._tipoPagamento.IdTipoPagamento);

                    if (this._servicoPrestador == null)
                        tabBeneficio.tab_relacao_prestador_tipo_servico_produtoReference.EntityKey = null;
                    else
                        tabBeneficio.tab_relacao_prestador_tipo_servico_produtoReference.EntityKey = new EntityKey("GENTEEntities.tab_relacao_prestador_tipo_servico_produto", "id_relacao_fornecedor_prestador", this._servicoPrestador.IdPrestadorServicoProduto);

                    tabBeneficio.dt_validade = this._dtValidade;
                    tabBeneficio.path = "";

                    _context.AddTotab_organizacao_beneficio_documento(tabBeneficio);
                    _context.SaveChanges();

                    this._idOrganizacaoBeneficio = RetornaUltIdOrganizacaoBeneficio();

                    int idTipoDocumento = ObterCodigoDocumento(this._tipoBeneficio.IdTipoBeneficio);
                    string _nomearquivo = ObterNomeImagem(this._organizacao.IdOrganizacao, idTipoDocumento, this._idOrganizacaoBeneficio);

                    AtualizarPath(this._path + _nomearquivo);
                    this._path = this._path + _nomearquivo;
                }
                else
                {
                    tab_organizacao_beneficio_documento tabBeneficio = (from beneficio in _context.tab_organizacao_beneficio_documento
                                                                        where beneficio.id_organizacao_beneficio == this._idOrganizacaoBeneficio
                                                                        select beneficio).First();

                    tabBeneficio.tab_organizacaoReference.EntityKey = new EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", this._organizacao.IdOrganizacao);
                    tabBeneficio.tab_tipo_beneficioReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_beneficio", "id_tipo_beneficio", this._tipoBeneficio.IdTipoBeneficio);

                    if (this._localidade == null)
                        tabBeneficio.tab_cidadeReference.EntityKey = null;
                    else
                        tabBeneficio.tab_cidadeReference.EntityKey = new EntityKey("GENTEEntities.tab_cidade", "id_cidade", this._localidade.IdCidade);

                    if (this._tipoPeriodicidade == null)
                        tabBeneficio.tab_tipo_periodicidadeReference.EntityKey = null;
                    else
                        tabBeneficio.tab_tipo_periodicidadeReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_periodicidade", "id_tipo_periodicidade", this._tipoPeriodicidade.IdTipoPeriodicidade);

                    if (this._tipoPagamento == null)
                        tabBeneficio.tab_tipo_pagamentoReference.EntityKey = null;
                    else
                        tabBeneficio.tab_tipo_pagamentoReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", this._tipoPagamento.IdTipoPagamento);

                    if (this._servicoPrestador == null)
                        tabBeneficio.tab_relacao_prestador_tipo_servico_produtoReference.EntityKey = null;
                    else
                        tabBeneficio.tab_relacao_prestador_tipo_servico_produtoReference.EntityKey = new EntityKey("GENTEEntities.tab_relacao_prestador_tipo_servico_produto", "id_relacao_fornecedor_prestador", this._servicoPrestador.IdPrestadorServicoProduto);

                    tabBeneficio.dt_validade = this._dtValidade;
                    
                    _context.SaveChanges();
                    this._path = tabBeneficio.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Excluir(string caminhoDoc)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    var consulta = (from beneficio in _context.tab_organizacao_beneficio_documento
                                    where beneficio.id_organizacao_beneficio == this._idOrganizacaoBeneficio
                                    select beneficio);

                    var listConsulta = consulta.ToList();

                    string documento = "";
                    foreach (var list in listConsulta)
                    {
                        documento = list.path;
                        _context.DeleteObject(list);
                        _context.SaveChanges();

                        System.IO.FileInfo fileInfo = new System.IO.FileInfo(documento);
                        documento = caminhoDoc + @"\" + fileInfo.Name;

                        if ((documento != "") && (System.IO.File.Exists(documento)))
                            System.IO.File.Delete(documento);
                    }

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
        #endregion

        #endregion
    }
}
